package com.nageoffer.shortlink.admin.config;

import org.redisson.api.RBloomFilter;
import org.redisson.api.RedissonClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 布隆过滤器配置
 */

/**
 * 注解和类声明:
 * @Configuration 注解表明这是一个配置类，Spring 会在应用启动时加载并处理该类中的 Bean 定义。
 *
 * Bean 方法:
 * @Bean 注解的方法 userRegisterCachePenetrationBloomFilter(RedissonClient redissonClient)：这是一个 Bean 方法，用于创建和配置布隆过滤器，并注册到 Spring 容器中。
 *
 *布隆过滤器初始化:
 *  RBloomFilter<String> cachePenetrationBloomFilter = redissonClient.getBloomFilter("userRegisterCachePenetrationBloomFilter");：
 * 通过 redissonClient 获取一个名为 "userRegisterCachePenetrationBloomFilter" 的布隆过滤器实例。Redisson 是 Redis 的 Java 客户端，提供了丰富的分布式数据结构支持。
 * cachePenetrationBloomFilter.tryInit(100000000L, 0.001);：
 * 调用布隆过滤器的 tryInit 方法初始化布隆过滤器。参数 100000000L 是预期元素数量，0.001 是期望的误判率。这里的初始化设置布隆过滤器的预期容量为 1 亿个元素，误判率为 0.1%。
 *
 * return cachePenetrationBloomFilter;：将配置好的布隆过滤器实例返回作为 Spring Bean。
 *
 * 总结：
 * 这段代码通过 Spring 的 @Configuration 注解声明了一个配置类，其中的 userRegisterCachePenetrationBloomFilter 方法作为 Bean 方法配置了一个布隆过滤器，用于缓存用户注册信息，以减少对数据库的查询压力。
 * 通过 Redisson 客户端获取布隆过滤器实例，并使用 tryInit 方法对其进行初始化，以确保布隆过滤器能够正确工作并具有所需的容量和性能特征。
 */
@Configuration
public class RBloomFilterConfiguration {

    /**
     * 防止用户注册查询数据库的布隆过滤器
     */
    @Bean
    public RBloomFilter<String> userRegisterCachePenetrationBloomFilter(RedissonClient redissonClient) {
        RBloomFilter<String> cachePenetrationBloomFilter = redissonClient.getBloomFilter("userRegisterCachePenetrationBloomFilter");
//        布隆过滤器初始化
        cachePenetrationBloomFilter.tryInit(100000000L, 0.001);
        return cachePenetrationBloomFilter;
    }

    /**
     * 防止分组标识注册查询数据库的布隆过滤器
     */
    @Bean
    public RBloomFilter<String> gidRegisterCachePenetrationBloomFilter(RedissonClient redissonClient) {
        RBloomFilter<String> cachePenetrationBloomFilter = redissonClient.getBloomFilter("gidRegisterCachePenetrationBloomFilter");
        cachePenetrationBloomFilter.tryInit(200000000L, 0.001);
        return cachePenetrationBloomFilter;
    }
}